<?php
// +----------------------------------------------------------------------
// | 海报生成器
// +----------------------------------------------------------------------

namespace plugins\Qrcode\controller;

use app\common\controller\Common;
use think\facade\Env;
use think\Image;

require_once(dirname(dirname(__FILE__))."/sdk/phpqrcode.php");
class GeneratePoster extends Common
{

    //生成二维码图片返回链接地址
    public function qrcode($value){
        $filename = date('YmdHis').'.jpg';
        $dir_name = date('Ymd');
        $file_dir = config('upload_path') . DIRECTORY_SEPARATOR . 'images/' . $dir_name ;
        if(!is_dir($file_dir)) @mkdir($file_dir);
        $file_path     = $file_dir.'/'.$filename;

        $level= 3; //目前容错率可分为L,M,Q,H四个等级,分别表示7%,15%,25%,30%
        $size = 6;
        $errorCorrectionLevel =intval($level);
        $matrixPointSize = intval($size);
        \QRcode::png($value, $file_path, $errorCorrectionLevel, $matrixPointSize, 2);
        $r_path= 'uploads/images/'.$dir_name.'/'.$filename;
        return [
            'file_dir'=>$file_dir,
            'file_path'=>$file_path,
            'dir_name'=>$dir_name,
            'file_name'=>$filename,
        ];
    }



    public function generate($arr = []){
//        $arr=[
//            'qrCodeImg_path'=> config('upload_path').'/images/20221115/e1e4abd926aa4d8aff03a12d9ab90c5a.png',
//            '$backgroundImg_path'=> config('static_path').'/admin/img/beijingtu.jpg',
//            'comNane'  =>'',
//            'username' =>'',
//            'card_code'=>'',
//            'file_dir'=>'',
//        ];

        $qrCodeImg     = $arr['qrCodeImg_path'];
        $backgroundImg = $arr['backgroundImg_path'];
        // 字体文件，可以去百度下载，计算机里面也有，可以复制到项目里去用，路径要用绝对路径
        $fontPath = config('static_path').'/admin/fonts/SimHei.ttf';
        // $boldFontPath = config('static_path').'/admin/fonts/fontawesome-webfont.ttf';
        $config = [
            'text' => [
//                [//用户信息
//                    'text'      => $arr['comNane'],
//                    'left'      => 32,				//文字距离左边框多远(负数是从右往左)
//                    'top'       => 45,			//文字距离上边框多远(负数是从下往上)
//                    'fontPath'  => $fontPath,		//字体文件
//                    'fontSize'  => 14,				//字号
//                    'fontColor' => '98,98,98',		//字体颜色
//                    'angle'     => 0,				//倾斜角度
//                ],
//                [
//                    'text'      => $arr['username'],
//                    'left'      => 89,				//文字距离左边框多远(负数是从右往左)
//                    'top'       => 120,			//文字距离上边框多远(负数是从下往上)
//                    'fontPath'  => $fontPath,		//字体文件
//                    'fontSize'  => 12,				//字号
//                    'fontColor' => '11,8,0,26',		//字体颜色
//                    'angle'     => 0,				//倾斜角度
//                ],
                [
                    'text'      => '食堂饭卡',
                    'left'      => 89,				//文字距离左边框多远(负数是从右往左)
                    'top'       => 45,			//文字距离上边框多远(负数是从下往上)
                    'fontPath'  => $fontPath,		//字体文件
                    'fontSize'  => 12,				//字号
                    'fontColor' => '11,8,0,26',		//字体颜色
                    'angle'     => 0,				//倾斜角度
                ],
                [
                    'text'      => $arr['card_code'],
                    'left'      => 55,				//文字距离左边框多远(负数是从右往左)
                    'top'       => 340,			//文字距离上边框多远(负数是从下往上)
                    'fontPath'  => $fontPath,		//字体文件
                    'fontSize'  => 12,				//字号
                    'fontColor' => '98,98,98',		//字体颜色
                    'angle'     => 0,				//倾斜角度
                ],
            ],
            'image' => [
//                [//海报上部分图
//                    'url'       => $qrCodeImg,
//                    'stream'    => 0,
//                    'left'      => 85,
//                    'top'       => -240,
//                    'right'     => 0,
//                    'bottom'    => 0,
//                    'width'     => 100,
//                    'height'    => 100,
//                    'opacity'   => 100,
//                    'radius'    => 15,
//                ],
                [//二维码信息
                    'url'       => $qrCodeImg , //图片地址(待域名，因为https的图片无法读取识别，这里最好做一下https转http处理；因为我在别的地方处理过，这里不再处理)
                    'stream'    => 0,//图片资源是否是字符串图像流
                    'left'      => 42,//图片距离左边框多远(负数是从右往左)
                    'top'       => 160,//图片距离上边框多远(负数是从下往上)
                    'right'     => 0,
                    'bottom'    => 0,
                    'width'     => 155,//图片宽度(不要超过背景图的尺寸)
                    'height'    => 155,//图片高度(不要超过背景图的尺寸)
                    'opacity'   => 100,//透明度
                    'radius'    => 1,//图片圆角角度
                ],
//
            ],
            'background' =>$backgroundImg //最底层背景图，必填.jpg'//背景图
        ];

//        $file_dir =  config('upload_path').'/images/'.date('Ymd',time());
        $file_dir =  $arr['file_dir'];
        if(!is_dir($file_dir)) @mkdir($file_dir);
        $filename = 'HB'.$arr['file_name'];
        $file_path = $file_dir.'/'.$filename;


        // 这里调用上面生成海报的根方法，将组装的参数和设置的图片名称传过去
        $url = $this->createPoster($config,$file_path);
        // 这里会直接输出海报图，在调试的时候开启使用
        //echo "<img src='".$file_path."'>";
        return $filename;
       // return $file_path;
    }

    /**
     * 生成宣传海报
     * @param array  参数,包括图片和文字
     * @param string  $filename 生成海报文件名,不传此参数则不生成文件,直接输出图片
     * @return [type] [description]
     */
    public function createPoster($config=[],$filename="")
    {
        //如果要看报什么错，可以先注释调这个header
        if(empty($filename)) header("content-type: image/png");
        $imageDefault = array(
            'left'=>0,
            'top'=>0,
            'right'=>0,
            'bottom'=>0,
            'width'=>100,
            'height'=>100,
            'opacity'=>100
        );
        $textDefault = array(
            'text'=>'',
            'left'=>0,
            'top'=>0,
            'fontSize'=>32,       //字号
            'fontColor'=>'255,255,255', //字体颜色
            'angle'=>0,
        );
        $background = $config['background'];//海报最底层得背景
        //背景方法
        $backgroundInfo = getimagesize($background);
        $backgroundFun = 'imagecreatefrom'.image_type_to_extension($backgroundInfo[2], false);
        $background = $backgroundFun($background);
        $backgroundWidth = imagesx($background);  //背景宽度
        $backgroundHeight = imagesy($background);  //背景高度
        $imageRes = imageCreatetruecolor($backgroundWidth,$backgroundHeight);
        $color = imagecolorallocate($imageRes, 0, 0, 0);
        imagefill($imageRes, 0, 0, $color);
        // imageColorTransparent($imageRes, $color);  //颜色透明
        imagecopyresampled($imageRes,$background,0,0,0,0,imagesx($background),imagesy($background),imagesx($background),imagesy($background));
        //处理了图片
        if(!empty($config['image'])){
            foreach ($config['image'] as $key => $val) {
                $val = array_merge($imageDefault,$val);
                $info = getimagesize($val['url']);
                $function = 'imagecreatefrom'.image_type_to_extension($info[2], false);
                if($val['stream']){   //如果传的是字符串图像流
                    $info = getimagesizefromstring($val['url']);
                    $function = 'imagecreatefromstring';
                }
                $res = $function($val['url']);
                $resWidth = $info[0];
                $resHeight = $info[1];
                //建立画板 ，缩放图片至指定尺寸
                $canvas=imagecreatetruecolor($val['width'], $val['height']);
                imagefill($canvas, 0, 0, $color);
                //关键函数，参数（目标资源，源，目标资源的开始坐标x,y, 源资源的开始坐标x,y,目标资源的宽高w,h,源资源的宽高w,h）
                imagecopyresampled($canvas, $res, 0, 0, 0, 0, $val['width'], $val['height'],$resWidth,$resHeight);
                $val['left'] = $val['left']<0?$backgroundWidth- abs($val['left']) - $val['width']:$val['left'];
                $val['top'] = $val['top']<0?$backgroundHeight- abs($val['top']) - $val['height']:$val['top'];
                //放置图像
                imagecopymerge($imageRes,$canvas, $val['left'],$val['top'],$val['right'],$val['bottom'],$val['width'],$val['height'],$val['opacity']);//左，上，右，下，宽度，高度，透明度
            }
        }
        //处理文字
        if(!empty($config['text'])){
            foreach ($config['text'] as $key => $val) {
                $val = array_merge($textDefault,$val);
                list($R,$G,$B) = explode(',', $val['fontColor']);
                $fontColor = imagecolorallocate($imageRes, $R, $G, $B);
                $val['left'] = $val['left']<0?$backgroundWidth- abs($val['left']):$val['left'];
                $val['top'] = $val['top']<0?$backgroundHeight- abs($val['top']):$val['top'];
                imagettftext($imageRes,$val['fontSize'],$val['angle'],$val['left'],$val['top'],$fontColor,$val['fontPath'],$val['text']);
            }
        }
        //生成图片
        if(!empty($filename)){
            $res = imagejpeg ($imageRes,$filename,90); //保存到本地
            imagedestroy($imageRes);
            if(!$res) return false;
            return $filename;
        }else{
            imagejpeg ($imageRes);     //在浏览器上显示
            imagedestroy($imageRes);
        }
    }

    // 因为文字表情无法显示，提供一个过滤表情的方法
    // 过滤掉emoji表情，在参数组装时调用，过滤掉表情
    public function filterEmoji($str)
    {
        $str = preg_replace_callback('/./u', function (array $match) {
            return strlen($match[0]) >= 4 ? '' : $match[0];
        }, $str);
        return $str;
    }


}